package utils

import (
	"net"
	"net/http"
	"strings"
)

// 获取请求的 IP 地址，
// 在 Go 中，使用 r.Header.Get("X-Forwarded-For") 或 r.Header.Get("x-forwarded-for") 都可以正确获取值，
// 因为 http.Header 内部会自动进行大小写不敏感查找。
func GetIP(r *http.Request) string {
	var ip string

	headers := []string{
		"X-Forwarded-For",
		"X-Real-IP",
	}

	for _, header := range headers {
		if ip = r.Header.Get(header); ip != "" {
			ip = strings.Split(ip, ",")[0]
			return ip
		}
	}
	// 前面如果获取到了会直接return，否则这里继续将获取到的ip进行拆分，如果有报错则直接返回远程ip
	ip, _, err := net.SplitHostPort(ip)
	if err != nil {
		ip, _, err = net.SplitHostPort(r.RemoteAddr)
		if err != nil {
			ip = r.RemoteAddr
		}
	}
	return ip
}
